package pe.gob.osinergmin.activity.dialog;

import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.text.InputType;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

import pe.gob.osinergmin.R;
import pe.gob.osinergmin.activity.generic.GenericDialog;
import pe.gob.osinergmin.bean.SupervisionMovil;
import pe.gob.osinergmin.bean.SupervisionMovilDetalleSCOP;
import pe.gob.osinergmin.bean.common.Producto;
import pe.gob.osinergmin.utils.PuntoControlConstants;
import pe.gob.osinergmin.utils.PuntoControlUtils;

public class RegisterItemDialog extends GenericDialog implements View.OnClickListener, AdapterView.OnItemSelectedListener {

    private TableLayout table;

    private List<Producto> productoList;

    private List<String> ordenPedidoList;

    private List<SupervisionMovilDetalleSCOP> supervisionMovilDetalleSCOPList;

    private SupervisionMovil supervisionMovil;

    // Controles
    private EditText txtCompartimiento;

    private EditText txtCantidad;

    private EditText txtCapacidad;

    private Spinner cmbProducto;

    private Spinner cmbAutorizacion;

    private EditText txtAutorizacion;

    private EditText txtSuperior;

    private EditText txtInferior;

    private EditText txtObservacion;

    private Activity activity;

    // Codigo to modify
    private Integer index = -1;

    public RegisterItemDialog(Context context) {
        super(context);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_register);
        getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
        getWindow().setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL);

        TextView btnGuardarItem = (TextView) findViewById(R.id.btnGuardarItem);
        btnGuardarItem.setOnClickListener(this);

        TextView btnCancelarItem = (TextView) findViewById(R.id.btnCancelarItem);
        btnCancelarItem.setOnClickListener(this);

        boolean retorno = (supervisionMovil.getTramo() == 2);

        cmbProducto = (Spinner) findViewById(R.id.cmbProducto);
        cmbProducto.setOnItemSelectedListener(this);

        cmbAutorizacion = (Spinner) findViewById(R.id.cmbAutorizacion);
        cmbAutorizacion.setOnItemSelectedListener(this);

        txtAutorizacion = (EditText) findViewById(R.id.txtAutorizacion);

        // Function to jump to superior editText on press Enter (KeyCode = 13)
        txtAutorizacion.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (event.getAction() == KeyEvent.ACTION_DOWN){
                    switch(keyCode){
                        case KeyEvent.KEYCODE_NUMPAD_ENTER:
                        case KeyEvent.KEYCODE_ENTER:
                            txtSuperior.requestFocus();
                            return true;
                        default:
                            break;
                    }
                }
                return false;
            }
        });

        // Function to start input type in number
        txtAutorizacion.setRawInputType(InputType.TYPE_CLASS_NUMBER);

        try {
            productoList = getProductoService().getProductoList(getContext());
        }catch(Exception e){
            e.printStackTrace();
        }

        try{
            ordenPedidoList = getOrdenPedidoService().getOrdenPedidoFromPlacaList(getContext(), PuntoControlConstants.unidadOperativa.getPlaca());
        }catch(Exception e){
            e.printStackTrace();
        }

        List<String> list = null;
        if(productoList != null) {
            list = new ArrayList<>();
            for (Producto producto : productoList) {
                list.add(producto.getDescripcion());
            }
        }

        if(list != null) {
            ArrayAdapter<String> arrayAdapterProducto = new ArrayAdapter<>(getContext(), R.layout.item_spinner, list);
            arrayAdapterProducto.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            cmbProducto.setAdapter(arrayAdapterProducto);
        }

        TableRow trAutorizacion = (TableRow) findViewById(R.id.trAutorizacion);

        if(ordenPedidoList != null) {
            ArrayAdapter<String> arrayAdapterAutorizacion = new ArrayAdapter<>(getContext(), R.layout.item_spinner, ordenPedidoList);
            arrayAdapterAutorizacion.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            cmbAutorizacion.setAdapter(arrayAdapterAutorizacion);
            trAutorizacion.removeView(txtAutorizacion);
            txtAutorizacion = null;
        }else{
            trAutorizacion.removeView(cmbAutorizacion);
            cmbAutorizacion = null;
        }

        txtCompartimiento = (EditText) findViewById(R.id.txtCompartimiento);

        txtCantidad = (EditText) findViewById(R.id.txtCantidad);

        txtCapacidad = (EditText) findViewById(R.id.txtCapacidad);

        txtSuperior = (EditText) findViewById(R.id.txtSuperior);

        // Function to copy information to inferior with out the last character
        txtSuperior.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if(hasFocus){
                    String superior = txtSuperior.getText().toString();
                    String inferior = txtInferior.getText().toString();
                    if(superior == null || PuntoControlConstants.EMPTY.equals(superior)){
                        if(inferior != null && !PuntoControlConstants.EMPTY.equals(inferior)){
                            txtSuperior.setText(inferior.substring(0, inferior.length() - 1));
                        }
                    }
                }
                if(!hasFocus){
                    String superior = txtSuperior.getText().toString();
                    String inferior = txtInferior.getText().toString();
                    if(inferior != null && !PuntoControlConstants.EMPTY.equals(inferior)) {
                        if (superior != null && !PuntoControlConstants.EMPTY.equals(superior)) {
                            if(superior.equalsIgnoreCase(inferior)){
                                txtSuperior.setText(inferior.substring(0, inferior.length() - 1));
                                makeText(getContext(), R.string.scop_validation_item_precinto, Toast.LENGTH_SHORT);
                            }
                        }
                    }
                }
            }
        });

        // Function to jump to inferior editText on press Enter (KeyCode = 13)
        txtSuperior.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (event.getAction() == KeyEvent.ACTION_DOWN){
                    switch(keyCode){
                        case KeyEvent.KEYCODE_NUMPAD_ENTER:
                        case KeyEvent.KEYCODE_ENTER:
                            txtInferior.requestFocus();
                            return true;
                        default:
                            break;
                    }
                }
                return false;
            }
        });

        // Function to start input type in number
        txtSuperior.setRawInputType(InputType.TYPE_CLASS_NUMBER);


        txtInferior = (EditText) findViewById(R.id.txtInferior);

        // Function to copy information to superior with out the last character
        txtInferior.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if(hasFocus){
                    String superior = txtSuperior.getText().toString();
                    String inferior = txtInferior.getText().toString();
                    if(inferior == null || PuntoControlConstants.EMPTY.equals(inferior)){
                        if(superior != null && !PuntoControlConstants.EMPTY.equals(superior)){
                            txtInferior.setText(superior.substring(0, superior.length() - 1));
                        }
                    }
                }
                if(!hasFocus){
                    String superior = txtSuperior.getText().toString();
                    String inferior = txtInferior.getText().toString();
                    if(inferior != null && !PuntoControlConstants.EMPTY.equals(inferior)) {
                        if (superior != null && !PuntoControlConstants.EMPTY.equals(superior)) {
                            if(superior.equalsIgnoreCase(inferior)){
                                txtInferior.setText(superior.substring(0, superior.length() - 1));
                                makeText(getContext(), R.string.scop_validation_item_precinto, Toast.LENGTH_SHORT);
                            }
                        }
                    }
                }
            }
        });

        // Function to jump to observacion editText on press Enter (KeyCode = 13)
        txtInferior.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (event.getAction() == KeyEvent.ACTION_DOWN){
                    switch(keyCode){
                        case KeyEvent.KEYCODE_NUMPAD_ENTER:
                        case KeyEvent.KEYCODE_ENTER:
                            txtObservacion.requestFocus();
                            return true;
                        default:
                            break;
                    }
                }
                return false;
            }
        });

        // Function to start input type in number
        txtInferior.setRawInputType(InputType.TYPE_CLASS_NUMBER);

        txtObservacion = (EditText) findViewById(R.id.txtObservacion);

        // Validation to retorno trip
        if(retorno){
            TableLayout tableRegister = (TableLayout) findViewById(R.id.tableRegister);
            if(txtCantidad != null){
                txtCantidad.setText(PuntoControlConstants.EMPTY);
                txtCantidad.setVisibility(View.INVISIBLE);

                TableRow trCantidad = (TableRow) findViewById(R.id.trCantidad);
                tableRegister.removeView(trCantidad);
            }

            if(txtCapacidad != null) {
                txtCapacidad.setText(PuntoControlConstants.EMPTY);
                txtCapacidad.setVisibility(View.INVISIBLE);

                TableRow trCapacidad = (TableRow) findViewById(R.id.trCapacidad);
                tableRegister.removeView(trCapacidad);
            }

            if(cmbProducto != null) {
                cmbProducto.setSelection(-1);
                cmbProducto.setVisibility(View.INVISIBLE);

                TableRow trProducto = (TableRow) findViewById(R.id.trProducto);
                tableRegister.removeView(trProducto);
            }

            if(cmbAutorizacion != null) {
                cmbAutorizacion.setSelection(-1);
                cmbAutorizacion.setVisibility(View.INVISIBLE);

                tableRegister.removeView(trAutorizacion);
            }

            if(txtAutorizacion != null) {
                txtAutorizacion.setText(PuntoControlConstants.EMPTY);
                txtAutorizacion.setVisibility(View.INVISIBLE);

                tableRegister.removeView(trAutorizacion);
            }

            if(txtSuperior != null) {
                txtSuperior.setText(PuntoControlConstants.EMPTY);
                txtSuperior.setVisibility(View.INVISIBLE);

                TableRow trSuperior = (TableRow) findViewById(R.id.trSuperior);
                tableRegister.removeView(trSuperior);
            }

            if(txtInferior != null) {
                txtInferior.setText(PuntoControlConstants.EMPTY);
                txtInferior.setVisibility(View.INVISIBLE);

                TableRow trInferior = (TableRow) findViewById(R.id.trInferior);
                tableRegister.removeView(trInferior);
            }

            TableRow trTituloPrecintos = (TableRow) findViewById(R.id.trTituloPrecintos);
            tableRegister.removeView(trTituloPrecintos);
        }

        if(index != -1){
            // Si es editar
            if(!retorno) {
                SupervisionMovilDetalleSCOP supervisionMovilDetalleSCOP = supervisionMovilDetalleSCOPList.get(index);
                txtCompartimiento.setText(String.valueOf(supervisionMovilDetalleSCOP.getCompartimiento()));
                txtCapacidad.setText(String.valueOf(supervisionMovilDetalleSCOP.getCapacidad()));
                txtCantidad.setText(String.valueOf(supervisionMovilDetalleSCOP.getCantidad()));
                cmbProducto.setSelection(getPositionProductoFromCode(supervisionMovilDetalleSCOP.getProducto()));
                if (cmbAutorizacion != null) {
                    cmbAutorizacion.setSelection(getPositionAutorizacionFromCode(supervisionMovilDetalleSCOP.getAutorizacion()));
                } else {
                    txtAutorizacion.setText(supervisionMovilDetalleSCOP.getAutorizacion());
                }
                txtSuperior.setText(supervisionMovilDetalleSCOP.getSuperior());
                txtInferior.setText(supervisionMovilDetalleSCOP.getInferior());
                txtObservacion.setText(supervisionMovilDetalleSCOP.getObservacion());
            }else{
                SupervisionMovilDetalleSCOP supervisionMovilDetalleSCOP = supervisionMovilDetalleSCOPList.get(index);
                txtCompartimiento.setText(String.valueOf(supervisionMovilDetalleSCOP.getCompartimiento()));
                txtObservacion.setText(supervisionMovilDetalleSCOP.getObservacion());
            }
        }else{
            // Es nuevo
            if(!retorno) {
                txtCompartimiento.setText(PuntoControlConstants.EMPTY);
                txtCapacidad.setText(PuntoControlConstants.EMPTY);
                txtCantidad.setText(PuntoControlConstants.EMPTY);
                cmbProducto.setSelection(-1);
                if (cmbAutorizacion != null) {
                    cmbAutorizacion.setSelection(-1);
                } else {
                    txtAutorizacion.setText(PuntoControlConstants.EMPTY);
                }
                txtSuperior.setText(PuntoControlConstants.EMPTY);
                txtInferior.setText(PuntoControlConstants.EMPTY);
                txtObservacion.setText(PuntoControlConstants.EMPTY);
            }else{
                txtCompartimiento.setText(PuntoControlConstants.EMPTY);
                txtObservacion.setText(PuntoControlConstants.EMPTY);
            }
        }
    }

    @Override
    public void onClick(View v) {
        if(v.getId() == R.id.btnGuardarItem){
            // Se realiza la validación de los datos
            String compartimiento = txtCompartimiento.getText().toString();
            String capacidad = txtCapacidad != null ? txtCapacidad.getText().toString() : null;
            String cantidad = txtCantidad != null ? txtCantidad.getText().toString() : null;
            String superior = txtSuperior != null ? txtSuperior.getText().toString() : null;
            String inferior = txtInferior != null ? txtInferior.getText().toString() : null;

            if(PuntoControlConstants.EMPTY.equals(compartimiento)){
                makeText(getContext(), R.string.scop_validation_item_compartimiento, Toast.LENGTH_SHORT);
                return;
            }

            boolean retorno = (supervisionMovil.getTramo() == 2);

            if(!retorno) {
                if (PuntoControlConstants.EMPTY.equals(cantidad)) {
                    makeText(getContext(), R.string.scop_validation_item_cantidad, Toast.LENGTH_SHORT);
                    return;
                }

                if (PuntoControlConstants.EMPTY.equals(capacidad)) {
                    makeText(getContext(), R.string.scop_validation_item_capacidad, Toast.LENGTH_SHORT);
                    return;
                }

                if (PuntoControlConstants.EMPTY.equals(superior) && PuntoControlConstants.EMPTY.equals(inferior)) {
                    makeText(getContext(), R.string.scop_validation_item_blank_precinto, Toast.LENGTH_SHORT);
                    return;
                }
            }

            SupervisionMovilDetalleSCOP supervisionMovilDetalleSCOP = createSupervisionMovilDetalleSCOP(supervisionMovil);
            if(index == -1){
                supervisionMovilDetalleSCOPList.add(supervisionMovilDetalleSCOP);
                PuntoControlUtils.createNewRowTableDetalleSCOP(getTable(), supervisionMovilDetalleSCOP, productoList, activity);
            }else{
                supervisionMovilDetalleSCOPList.set(index, supervisionMovilDetalleSCOP);
                PuntoControlUtils.createRefreshRowTableDetalleSCOP(getTable(), supervisionMovilDetalleSCOP, index + 2, productoList, activity);
            }
            makeText(getContext(), "Se Almacenó satisfactoriamente", Toast.LENGTH_SHORT);
            this.dismiss();
        }
        if(v.getId() == R.id.btnCancelarItem){
            this.dismiss();
        }
    }



    private SupervisionMovilDetalleSCOP createSupervisionMovilDetalleSCOP(SupervisionMovil supervisionMovil) {
        SupervisionMovilDetalleSCOP result = new SupervisionMovilDetalleSCOP();
        // Se setean los datos de la cabecera
        result.setPlaca(supervisionMovil.getPlaca());
        result.setFechaRegistro(supervisionMovil.getFechaRegistro());

        result.setCompartimiento(Integer.parseInt(txtCompartimiento.getText().toString()));
        boolean retorno = (supervisionMovil.getTramo() == 2);

        if(!retorno) {
            result.setCapacidad(Integer.parseInt(txtCapacidad.getText().toString()));
            result.setCantidad(Integer.parseInt(txtCantidad.getText().toString()));
            Producto producto = productoList.get(cmbProducto.getSelectedItemPosition());
            result.setProducto(producto.getCodigo());
            result.setSuperior(txtSuperior.getText().toString());
            result.setInferior(txtInferior.getText().toString());
            if (cmbAutorizacion != null) {
                String autorizacion = ordenPedidoList.get(cmbAutorizacion.getSelectedItemPosition());
                result.setAutorizacion(autorizacion);
            } else {
                if (txtAutorizacion != null) {
                    result.setAutorizacion(txtAutorizacion.getText() != null ? txtAutorizacion.getText().toString() : null);
                } else {
                    result.setAutorizacion(null);
                }
            }
        }
        result.setObservacion(txtObservacion.getText().toString());
        return result;
    }

    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        // On selecting a spinner item
        // Producto itemSelected = productoList.get(position);

    }

    private Integer getPositionProductoFromCode(Integer codigo){
        Integer index = -1;
        if(productoList != null) {
            for (int i = 0; i < productoList.size(); i++) {
                Producto producto = productoList.get(i);
                if (producto.getCodigo().intValue() == codigo.intValue()) {
                    return i;
                }
            }
        }
        return index;
    }

    private Integer getPositionAutorizacionFromCode(String autorizacion){
        Integer index = -1;
        if(ordenPedidoList != null) {
            for (int i = 0; i < ordenPedidoList.size(); i++) {
                String _autorizacion = ordenPedidoList.get(i);
                if (_autorizacion.equals(autorizacion)) {
                    return i;
                }
            }
        }
        return index;
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }

    public TableLayout getTable() {
        return table;
    }

    public void setTable(TableLayout table) {
        this.table = table;
    }

    public void setIndex(Integer index){
        this.index = index;
    }

    public void setSupervisionMovilDetalleSCOPList(List<SupervisionMovilDetalleSCOP> supervisionMovilDetalleSCOPList){
        this.supervisionMovilDetalleSCOPList = supervisionMovilDetalleSCOPList;
    }

    public void setSupervisionMovil(SupervisionMovil supervisionMovil){
        this.supervisionMovil = supervisionMovil;
    }

    public void setActivity(Activity activity){
        this.activity = activity;
    }
}
